package cn.tqfeiyang.smartadmin.commons.toolbox;

import cn.tqfeiyang.smartadmin.commons.exception.BusinessException;
import org.springframework.util.Assert;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 校验工具类
 *
 * @author tqfeiyang
 * @wechat 18576228047
 * @email 1787585212@qq.com
 * @date 2024/8/15 9:47
 */
public class ValidationUtils {

    /**
     * 验证器
     */
    private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();

    /**
     * 手动验证对象 Model的属性
     * 需要配合 hibernate-validator 校验注解
     *
     * @param t
     * @return String 返回null代表验证通过，否则返回错误的信息
     */
    public static <T> String verify(T t) {
        // 获取验证结果
        Set<ConstraintViolation<T>> validate = VALIDATOR.validate(t);
        if (validate.isEmpty()) {
            // 验证通过
            return null;
        }
        // 返回错误信息
        List<String> messageList = validate.stream().map(ConstraintViolation::getMessage).collect(Collectors.toList());
        return StringUtils.collectionToDelimitedString(messageList, ", ");
    }

    /**
     * 校验对象，如果有错误则抛出 BusinessException
     *
     * @param dto 待校验的对象
     */
    public static <T> void validateProperties(T dto) {
        Assert.notNull(dto, "dto不能为空");
        String message = verify(dto);
        if (StringUtils.isNotBlank(message)) {
            throw new BusinessException(message);
        }
    }

}
